快速幂 & 矩阵运算

1 模板

注意开 long long

int qpow(int x, int y)
{
    int ans = 1;
    while (y)
    {
        if (y % 2)
            ans = (ans * x) % p;
        x = (x * x) % p;
        y /= 2;
    }
    return ans;
}

2 矩阵计算

../../../ZZZ-Misc/Z-Attachment/images-old-ACM/Z-attachment/屏幕截图 2023-11-21 183403.png

计算斐波那契数列,n263
可得:

[FnFn+1]=A[Fn1Fn]=A2[Fn2Fn1]=...=An1[F1F2]=An1[11] , A=[0111]

#define int long long
const int maxn = 15, mod = 1e9 + 7;
struct Matrix {
    int n, m;
    int v[maxn][maxn] = {};
    Matrix(int n, int m) :n(n), m(m) {}
    Matrix operator* (const Matrix B) const {
        Matrix C(n, B.m);
        for (int i = 1;i <= n;i++)
            for (int j = 1;j <= B.m;j++)
                for (int k = 1;k <= m;k++)
                    C.v[i][j] += v[i][k] * B.v[k][j], C.v[i][j] %= mod;
        return C;
    }
    // void print() {//输出该矩阵,用来测试 
    //     for (int i = 1;i <= n;i++)
    //         for (int j = 1;j <= m;j++)
    //             cout << v[i][j] << " \n"[i == m];
    // }
};
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n;cin >> n;
    if (n <= 2) {
        cout << "1\n";return 0;
    }
    Matrix A(2, 1), B(2, 2);
    A.v[1][1] = A.v[2][1] = 1;
    B.v[1][2] = B.v[2][1] = B.v[2][2] = 1;

    auto qpow = [&](int b) {
        while (b) {
            if (b & 1) A = B * A;
            B = B * B;b >>= 1;
        }
        };
    qpow(n - 2);
    cout << A.v[2][1] << '\n';
}

已知一个数列 a,它满足:

ax={1x{1,2,3}ax1+ax3x4

a 数列的第 n 项对 109+7 取余的值。

找出 A 矩阵即可。不一样的地方是 A 矩阵是 3 维的。
../../../ZZZ-Misc/Z-Attachment/images-old-ACM/Z-attachment/{222E6BF3-59E1-4bad-8B4A-3D65C9496B64}.png

5 练习: ../../ACMExercises/Luogu/B3646 数列前缀和 3 - 洛谷

链接